package mysql

import (
	"coarse_score_cal_flow/config"
	"coarse_score_cal_flow/model"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"time"
)

var DB *gorm.DB
var err error

func InitMySQL() {

	config := config.Conf.MySQLConfig
	dsn := fmt.Sprintf(
		"%s:%s@tcp(%s:%d)/gin?charset=utf8mb3&parseTime=True&loc=Local",
		config.User,
		config.Password,
		config.Host,
		config.Port,
	)

	// todo: 这里是不是连接池?
	// todo: 这里可以改成配置存下来
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
		NamingStrategy: schema.NamingStrategy{
			// 表名后面不加s
			SingularTable: true,
		},
		// 执行任何SQL时都会创建一个prepared statement并将其缓存，以提高后续的效率
		PrepareStmt: true,
		// 在AutoMigrate 或 CreateTable 时，GORM 会自动创建外键约束，若要禁用该特性，可将其设置为 true
		DisableForeignKeyConstraintWhenMigrating: true,
	})

	if err != nil {
		panic(err)
	}

	mysqlInstance, err := DB.DB()
	if err != nil {
		panic(err)
	}
	// := 创建了局部变量而不是全局变量
	// mysqlInstance, err := DB.DB()
	mysqlInstance.SetConnMaxLifetime(time.Duration(config.ConnMaxLifeTime) * time.Second)
	mysqlInstance.SetMaxIdleConns(config.MaxIdleConns)
	mysqlInstance.SetMaxOpenConns(config.MaxOpenConns)

	err = DB.AutoMigrate(&model.Actor{})
	// if err != nil {
	// 	panic(err)
	// }
	// todo: gorm没有close方法?
}

/*
// 设置新的Logger
func setNewLogger(gConfig *gorm.Config) {
	logPath := global.GvaConfig.Log.Path
	file, _ := os.OpenFile(logPath+"/sql.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm)
	// 日志级别映射 error、info、warn
	logLevelMap := map[string]logger.LogLevel{
		"error": logger.Error,
		"info":  logger.Info,
		"warn":  logger.Warn,
	}
	var logLevel logger.LogLevel
	var ok bool
	if logLevel, ok = logLevelMap[global.GvaConfig.Mysql.LogLevel]; !ok {
		logLevel = logger.Error
	}
	newLogger := logger.New(log.New(file, "\r\n", log.LstdFlags), logger.Config{
		SlowThreshold:             global.GvaConfig.Mysql.SlowSql,                   //慢SQL时间
		LogLevel:                  logLevel,                                         // 记录日志级别
		IgnoreRecordNotFoundError: global.GvaConfig.Mysql.IgnoreRecordNotFoundError, // 是否忽略ErrRecordNotFound(未查到记录错误)
		Colorful:                  false,                                            // 开关颜色
	})
	gConfig.Logger = newLogger
}
*/
